package cn.zhangjie.basic.service.imp;

import cn.zhangjie.basic.constant.RegisterConstant;
import cn.zhangjie.basic.exception.BusinssException;
import cn.zhangjie.basic.service.IVerifyCodeService;
import cn.zhangjie.basic.util.SmsSendUtil;
import cn.zhangjie.basic.util.StrUtils;
import cn.zhangjie.basic.util.VerifyCodeUtils;
import cn.zhangjie.user.domain.User;
import cn.zhangjie.user.mapper.UserMapper;
import org.springframework.beans.factory.annotation.Autowired;
import org.springframework.data.redis.core.RedisTemplate;
import org.springframework.stereotype.Service;
import org.springframework.util.StringUtils;

import java.util.Map;
import java.util.concurrent.TimeUnit;

@Service
public class VerifyCodeServiceImpl implements IVerifyCodeService {
    @Autowired
    private RedisTemplate redisTemplate;
    @Autowired
    private UserMapper userMapper;

    @Override
    public String getVerifyCode(String key) {
        //1检验一波
        if(StringUtils.isEmpty(key)){
            throw new BusinssException("参数有误");
        }
        //2生成随机验证码
        String code = StrUtils.getComplexRandomString(4);
        //3存入redis中，设置过期时间，3分钟
        redisTemplate.opsForValue().set(key,code,3, TimeUnit.MINUTES);
        //4生成一个base64位字符串
        return VerifyCodeUtils.verifyCode(100,40,code);
    }

    @Override
    public void smsCode(Map<String, String> map) {
        //1校验，参数不能为空
        String phone = map.get("phone");
        String imageCode = map.get("imageCode");
        String imageCodeKey = map.get("imageCodeKey");
        if(StringUtils.isEmpty(phone)||StringUtils.isEmpty(imageCode)||StringUtils.isEmpty(imageCodeKey)){
            throw  new BusinssException("图形验证码过期了，请重新获取输入！");
        }
        //2图形验证码校验
        Object obj = redisTemplate.opsForValue().get(imageCodeKey);
        if(obj==null){
            throw  new BusinssException("图形验证码过期了，请重新获取输入！");
        }
        //验证么不区分大小写
        if(!obj.toString().equalsIgnoreCase(imageCode)){
            throw  new BusinssException("图形验证码输入错误，请重新获取输入！");
        }
        //3手机号是否被注册过，查询user
        User user = userMapper.findByphone(phone);
        if(user!=null){
            throw  new BusinssException("手机号已经被注册，请直接登录");
        }
        //4判断是否是第一次发送请求，或者是验证码过期，，从redis中取
        Object value = redisTemplate.opsForValue().get(phone + RegisterConstant.PHONEREGISTER);
        String code = null;
        //4.1如果娶不到，没有发送过，获取过期了，直接生成一个新的验证码
        if(value==null){
            code = StrUtils.getComplexRandomString(6);
        }else {
            //4.2如果取到了，判断是否超过了一分钟
            String redisTime = value.toString().split(":")[1];
            long ltime = Long.parseLong(redisTime);
            //4.2.1如果没有超过一分钟，直接提示用户，1分钟不能多次发送
            if(System.currentTimeMillis()-ltime<1*60*1000){
                throw  new BusinssException("1分钟不能多次发送");
            }else {
                //4.2.2;如果超过了一分钟，就刷新时间
                code = value.toString().split(":")[0];
            }
        }

        //4.2.1把code存入redis中
        redisTemplate.opsForValue().set(phone+RegisterConstant.PHONEREGISTER,code+":"+System.currentTimeMillis(),3,TimeUnit.MINUTES);
        //5发送短信给用户
        //SmsSendUtil.sendSms(phone,"你的验证码是"+code+"，请在3分钟之内使用");
        System.out.println("你的验证码是"+code+"，请在3分钟之内使用");


    }

    @Override
    public void binderSmsCode(Map<String, String> map) {
        //1校验，参数不能为空
        String phone = map.get("phone");

        if(StringUtils.isEmpty(phone)){
            throw  new BusinssException("手机号不能为空获取输入！");
        }
        //4判断是否是第一次发送请求，或者是验证码过期，，从redis中取
        Object value = redisTemplate.opsForValue().get(phone + RegisterConstant.WXBINDER);
        String code = null;
        //4.1如果娶不到，没有发送过，获取过期了，直接生成一个新的验证码
        if(value==null){
            code = StrUtils.getComplexRandomString(6);
        }else {
            //4.2如果取到了，判断是否超过了一分钟
            String redisTime = value.toString().split(":")[1];
            long ltime = Long.parseLong(redisTime);
            //4.2.1如果没有超过一分钟，直接提示用户，1分钟不能多次发送
            if(System.currentTimeMillis()-ltime<1*60*1000){
                throw  new BusinssException("1分钟不能多次发送");
            }else {
                //4.2.2;如果超过了一分钟，就刷新时间
                code = value.toString().split(":")[0];
            }
        }

        //4.2.1把code存入redis中
        redisTemplate.opsForValue().set(phone+RegisterConstant.WXBINDER,code+":"+System.currentTimeMillis(),3,TimeUnit.MINUTES);
        //5发送短信给用户
        //SmsSendUtil.sendSms(phone,"你的验证码是"+code+"，请在3分钟之内使用");
        System.out.println("你的验证码是"+code+"，请在3分钟之内使用");
    }
}
